﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.VariedadesGrupos
{
    /// <summary>
    /// Implementación del servicio de grupos de variedades.
    /// </summary>
    public class VariedadesGrupoService
        : IVariedadesGrupoService
    {
        #region Private properties

        /// <summary>
        /// Repositorio de grupos de variedades.
        /// </summary>
        private IVariedadesGrupoRepository _variedadesGrupoRepository;

        #endregion

        #region Constructor

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="variedadesGrupoRepository">
        /// Repositorio del grupo de variedades.
        /// </param>
        public VariedadesGrupoService(IVariedadesGrupoRepository variedadesGrupoRepository)
        {
            if (variedadesGrupoRepository == null)
                throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "variedadesGrupoRepository");
            _variedadesGrupoRepository = variedadesGrupoRepository;
        }

        #endregion

        /// <summary>
        /// 
        /// </summary>
        /// <param name="grupo"></param>
        public void AddVariedadesGrupo(Entities.VariedadesGrupo grupo)
        {
            if (grupo == null)
                throw new ArgumentNullException(Messages.exception_InvalidArgument, "grupo");
            IUnitOfWork unitOfWork = _variedadesGrupoRepository.StoreContext;
            _variedadesGrupoRepository.Add(grupo);
            try
            {
                unitOfWork.Commit();
            }
            catch (OptimisticConcurrencyException)
            {
                unitOfWork.RollbackChanges();
                unitOfWork.CommitAndRefreshChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="grupo"></param>
        public void ChangeVariedadesGrupo(Entities.VariedadesGrupo grupo)
        {
            if (grupo == null)
                throw new ArgumentNullException(Messages.exception_InvalidArgument, "grupo");
            IUnitOfWork unitOfWork = _variedadesGrupoRepository.StoreContext;
            _variedadesGrupoRepository.Modify(grupo);
            try
            {
                unitOfWork.Commit();
            }
            catch (OptimisticConcurrencyException)
            {
                unitOfWork.RollbackChanges();
                unitOfWork.CommitAndRefreshChanges();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="cultivoGuid"></param>
        /// <returns></returns>
        public List<Entities.VariedadesGrupo> FindVariedadesGruposByCultivo(Guid cultivoGuid)
        {
            if (cultivoGuid == Guid.Empty)
                throw new ArgumentException(Messages.exception_InvalidArgument, "cultivoGuid");
            VariedadesGruposByCultivoSpecification specification = new VariedadesGruposByCultivoSpecification(cultivoGuid);
            return _variedadesGrupoRepository.FindVariedadesGruposByCultivo(specification).ToList();
        }

        public void Dispose()
        {
            if (_variedadesGrupoRepository != null && _variedadesGrupoRepository.StoreContext != null)
                _variedadesGrupoRepository.StoreContext.Dispose();
        }
    }
}
